package towers;

import java.awt.Dimension;
import java.awt.geom.Point2D;

import javax.swing.ImageIcon;

import core.ShootingUnit;
import enemies.Enemy;

/**
 * @author onbekend
 * @version 1.1
 * @since 2011-04-11
 */
public abstract class Tower extends ShootingUnit {

	protected Enemy aimAtEnemy;
	protected int cost;
	protected static String name;
	protected static final ImageIcon image = new ImageIcon("images/cannon.gif");
	// protected static final Dimension size = new Dimension(
	// Cannon.image.getIconWidth(), Cannon.image.getIconHeight() );
	protected static final Dimension size = new Dimension(image.getIconWidth(), image.getIconHeight());

	/**
	 * 
	 * @param position Positie van de toren
	 * @param health Health van de toren
	 * @param image het plaatje wat voor de toren gebruikt word
	 * @param size De grootte van een toren
	 * @param viewAngle De begin-kijkhoek van een toren
	 * @param range De afstand wat een toren kan schieten
	 * @param firerate Hoe snel een toren kan schieten
	 * @param cost Hoe duur een toren is
	 */
	/* /// Constructor //////////////////////////////////////// */
	public Tower(Point2D.Double position, int health, ImageIcon image, Dimension size, int viewAngle, int range,
			int firerate, int cost) {
		super(position, health, image, size, viewAngle, range, firerate);

		this.cost = cost;
	}

	/* /// getAimAtEnemy //////////////////////////////////////// */
	public Enemy getAimAtEnemy() {
		return aimAtEnemy;
	}

	/* /// setAimAtEnemy //////////////////////////////////////// */
	public void setAimAtEnemy(Enemy aimAtEnemy) {
		this.aimAtEnemy = aimAtEnemy;
	}

	/**
	 * @return Kosten van de toren
	 */
	/* /// getCost //////////////////////////////////////// */
	public int getCost() {
		return cost;
	}

	/* /// getForesideEnemy //////////////////////////////////////// */
	public Point2D.Double getForesideEnemy() {
		return aimAtEnemy.getMiddle();
	}

	/**
	 * Viewangle aanpassen, moet wijzen naar enemy
	 * 
	 * @return boolean Geeft true terug als er iets veranderd
	 */
	/* /// aimAtEnemy //////////////////////////////////////// */
	protected boolean aimAtEnemy() {
		if (this.position != null && aimAtEnemy != null) {
			Point2D.Double enemyPos = aimAtEnemy.getPosition();
			double x = enemyPos.getX() - position.x;
			double y = enemyPos.getY() - position.y;

			// vijand links van toren
			if (x < 0) {
				// vijand hoger dan toren
				x *= -1;
				if (y < 0) {
					y *= -1;
					viewAngle = (int) Math.toDegrees((Math.atan((y / x)))) + 90;
				}
				// vijand lager dan toren
				else if (y > 0) {
					viewAngle = (int) Math.toDegrees((Math.atan((x / y))));
				}
				// vijand rechts van toren
			} else if (x >= 0) {
				if (y < 0) {
					y *= -1;
					viewAngle = (int) Math.toDegrees((Math.atan((x / y)))) + 180;
				} else if (y > 0) {
					viewAngle = (int) Math.toDegrees((Math.atan((y / x)))) + 270;
				}
			}

			return true;
		}

		return false;
	}
	
	/**
	 * @see core.ShootingUnit#update()
	 */
	/* /// update //////////////////////////////////////// */
	public boolean update() {
		// Is de enemy al dood?
		if (aimAtEnemy != null && aimAtEnemy.getHealth() <= 0) {
			aimAtEnemy = null;
		}

		return super.update();
	}
}